home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_01 / julday.c < prev    next >
C/C++ Source or Header  |  1988-09-08  |  3KB  |  117 lines

  1.  
  2. /* julday.c  - convert a julian day number (double) to mm, dd, yyyy, & v.v.
  3.                see also: Press, et al., Numerical Recipes, pp. 681, 682 
  4.  
  5.    This is the business, or non-astronomical, version of julian days.
  6.    In other words, the julian day number assumes local noon; there is
  7.    no fractional part to the julian day number indicating time of day.
  8.  
  9.    Does not recognize 400-year leapyear cycle; 
  10.    i.e., incorrectly assumes that 2000 A.D. is a leap year.
  11.  
  12. */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16.  
  17. /* after some nicely-done Pascal routines by Carley Phillips, 4/10/88, 
  18.    converted to C, 9/8/88, by d.c.oshel
  19.    */
  20.  
  21. #define inrange(J) ((julianmin <= J) && (J <= julianmax))
  22.  
  23. #define MDYtoJul(M,D,Y) mdy2jul((long)M,(long)D,(long)Y)
  24.  
  25. static long julianconstant =  1721119L, /* Julian Day for 02-28-0000  */
  26.             julianmin      =  1721120L, /* Julian Day for 03-01-0000  */
  27.             julianmax      = 25657575L, /* Julian Day for 12-31-65535 */
  28.             julianDOS      =  2444240L, /* Julian Day for 01-01-1980  */ 
  29.             juliannil      =        0L; /* error return */
  30.  
  31.             
  32. /* sets month, day, year to Julian Day number */
  33.  
  34. void jul2mdy (  long jday,     /* valid Julian Day number */
  35.                 int * mm,      /* Gregorian month returned */
  36.                 int * dd,      /* Gregorian day   returned */
  37.                 int * yy       /* Gregorian year  returned */
  38.                 )
  39. {
  40.    long tmp1, tmp2, year, month, day;
  41.  
  42.    if ( inrange( jday ) )
  43.    {
  44.           tmp1  = jday - julianconstant; /* will be at least 1 */
  45.           year  = ((tmp1-1) / 1460969L) * 4000L;
  46.           tmp1  = ((tmp1-1) % 1460969L) + 1L;
  47.           tmp1  = (4   *   tmp1) - 1L;
  48.           tmp2  = (4   * ((tmp1 % 146097L) / 4)) + 3;
  49.           year  = (100 *  (tmp1 / 146097L)) + (tmp2 / 1461L) + year;
  50.           tmp1  = (5 * (((tmp2 % 1461L) + 4) / 4)) - 3;
  51.           month =   tmp1 / 153;
  52.           day   = ((tmp1 % 153) + 5) / 5;
  53.           if (month < 10)
  54.                month  += 3;
  55.           else
  56.           {
  57.                month  -= 9;
  58.                year += 1;
  59.           }
  60.    }
  61.    else
  62.    {
  63.          month = 0L;
  64.          day   = 0L;
  65.          year  = 0L;
  66.    }
  67.    *mm = (int) month;
  68.    *dd = (int) day;
  69.    *yy = (int) year;
  70. }
  71.  
  72.  
  73.  
  74. /*  returns Julian Day number  */
  75.  
  76. long mdy2jul (  int month,      /* Gregorian calendar month */
  77.                 int day,        /* Gregorian calendar day */
  78.                 int year        /* Gregorian calendar year */
  79.                 )
  80. {
  81.    long tmon, tyear, jday;
  82.  
  83.    if (month > 2)
  84.    {
  85.          tmon  = month - 3;
  86.          tyear = year;
  87.    }
  88.    else
  89.    {
  90.          tmon  = month + 9;
  91.          tyear = year - 1;
  92.    }
  93.    jday  = (tyear / 4000L) * 1460969L;
  94.    tyear = (tyear % 4000L);
  95.    jday  = jday +
  96.             (((tyear / 100) * 146097L) / 4) +
  97.             (((tyear % 100) *   1461L) / 4) +
  98.             (((153   *  tmon) +      2) / 5) +
  99.             day +
  100.             julianconstant;
  101.    if ( !inrange( jday ) )
  102.       jday = juliannil;
  103.  
  104.    return ( jday );
  105. }
  106.  
  107.  
  108.  
  109. /* returns 1 thru 7 for Sun thru Sat, 0=invalid */
  110.  
  111. int day_of_week( long jday )
  112. {
  113.    return ( inrange( jday ) ? (((jday + 1) % 7) + 1) : 0 );
  114. }
  115.  
  116.  
  117.